
#include <rthw.h>
#include <rtthread.h>

static rt_tick_t rt_tick = 0; /* 系统时基计数器 */
extern rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];
extern rt_uint32_t rt_thread_ready_priority_group;


/**
 * This function will return current tick from operating system startup
 *
 * @return current tick
 */
rt_tick_t rt_tick_get(void)
{
    /* return the global tick */
    return rt_tick;
}

/**
 * This function will set current tick
 */
void rt_tick_set(rt_tick_t tick)
{
    rt_base_t level;

    level = rt_hw_interrupt_disable();
    rt_tick = tick;
    rt_hw_interrupt_enable(level);
}

/* 系统滴答时钟计数和任务调度处理 */
#if 0
void rt_tick_increase(void)
{
		rt_ubase_t i;
		struct rt_thread *thread;
		
		rt_tick ++;
#if 0
		/* 扫描就绪列表中所有线程的 remaining_tick，如果不为 0，则减 1 */
		for (i=0; i<RT_THREAD_PRIORITY_MAX; i++)
		{
				thread = rt_list_entry( rt_thread_priority_table[i].next, struct rt_thread, tlist);
				 if (thread->remaining_tick > 0)
				 {
						thread->remaining_tick --;
				 }
		}
#else
	/* 扫描就绪列表中所有线程的 remaining_tick，如果不为 0，则减 1。为 0 时将线程就绪优先级组相应优先级 bit 置1 */
		for (i=0; i<RT_THREAD_PRIORITY_MAX; i++)
		{
				thread = rt_list_entry( rt_thread_priority_table[i].next, struct rt_thread, tlist);
				if (thread->remaining_tick > 0)
				{
						thread->remaining_tick --;
						if (thread->remaining_tick == 0)
						{
								/* 如果线程的延时时间 remaining_tick 递减为 0，则表示延时时间结束，需要将线程插入到线程优先级表，
								即简单的根据优先级将线程就绪优先级组中对应的位置 1 即可。 因为在阻塞延时函数中，
								我们是通过清除线程就绪优先级组中对应的位来让线 程 挂 起 的 ， 并 没 有 将 线 程 从 线 程 优 先 级 表 里 面 移 除 ，
								所 以 这 里 将rt_schedule_insert_thread(thread);注释掉。*/
								//rt_schedule_insert_thread(thread);
								rt_thread_ready_priority_group |= thread->number_mask;
						}
				}
		}
#endif
		
		/* 系统调度 */
		rt_schedule();
}
#else
void rt_tick_increase(void)
{
		struct rt_thread *thread;
		
		/* 系统时基计数器加 1 操作,rt_tick 是一个全局变量 */
		++ rt_tick;
		
		/* 获取当前线程线程控制块 */
		thread = rt_thread_self();
		/* 时间片递减 */
		-- thread->remaining_tick;
		/* 如果时间片用完，则重置时间片，然后让出处理器 */
		if (thread->remaining_tick == 0)
		{
				/* 重置时间片 */
				thread->remaining_tick = thread->init_tick;
				/* 让出处理器 */
				rt_thread_yield();
		}
		
		/* 扫描系统定时器列表 */
		rt_timer_check();
}
#endif

